package com.weic.easycache.data.abs;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

public abstract class AbsJsonable<T> implements Jsonable<T> {
	private static final GsonBuilder gsonBuilder = new GsonBuilder()
	.excludeFieldsWithoutExposeAnnotation() //不导出实体中没有用@Expose注解的属性
	//.enableComplexMapKeySerialization() //支持Map的key为复杂对象的形式
	.serializeNulls()
	.disableHtmlEscaping()	//取消unicode及等号的转义
	//.setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")	//时间转化为特定格式
	//.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)	//会把字段首字母大写
	;

	public static <D> D fromJson(String json, Class<D> clazz) {
		return (D)new Gson().fromJson(json, clazz);
	}

	public static <D> D fromJson(String json, TypeToken<D> type) {
		return new Gson().fromJson(json, type.getType());
	}

	/**禁用@Expose模式，全部属性都会被序列化；如果使用@Expose模式，父类中带有@Expose的却不会被序列化，可能是个bug**/
	public final String toJsonWithAllFields() {
		return new Gson().toJson(this);
	}

	@Override
	public String toJson() {
		return gsonBuilder.create().toJson(this);
	}
}
